#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//int main()
//{
//	//算数操作符(运算符、双目操作符):+ - * / %
//
//	int a = 10;
//    int b = 20;
//    int c = a + b;
//	// +
//	printf("a + b = %d\n", c);
//
//	// -
//	printf("a - b = %d\n", a - b);
//
//	// *
//    printf("a * b = %d\n", a * b);
//
//	// /
//    printf("a / b = %d\n", a / b);
//	printf("6/4 = %d\n", 6 / 4);
//    printf("6/4 = %f f\n", 6 / 4);
//    printf("(float)6/4 = %f\n", (float)6 / 4);
//    printf("6/4.0 = %f\n", 6 / 4.0);
//    printf("6.0/4 = %f\n", 6.0 / 4);
//    printf("6.0/4 = %.2f\n", 6.0 / 4);
//	//如果 / 两端都是整数，则结果是整数
//	//如果 / 两端中有浮点数，则结果是浮点数
//	//用 %f 输出浮点数，小数点后默认六位小数
//	int score = 5;
//	score = (score / 20) * 100;
//    printf("score = %d\n", score);
//	score = 5;
//    score = (score / 20.0) * 100;
//    printf("score = %d\n", score);
//
//	// % (取模、取余，获得整除之后的余数)
//    printf("a %% b = %d\n", a % b);
//    printf("6 %% 4 = %d\n", 6 % 4);
//
//	printf("11 %% -5 = %d\n", 11 % -5);
//    printf("-11 %% -5 = %d\n", -11 % -5);
//    printf("-11 %% 5 = %d\n", -11 % 5);
//	//负数求模的规则是，结果的正负号随第一个运算数的正负号
//
////===============================================================
//
//	// 赋值操作符(双目操作符):= += -= *= /= %=
//
//	int e = 0;//初始化
//    e = 10;//赋值
//	//赋值操作符‘=’可以连续赋值
//	int x = 3;
//	int y = 4;
//	int z = 5;
//	z = y = x + 3;
//	//等价于 y = x + 3;
//	//		 z = y;
//    printf("x = %d, y = %d, z = %d\n", x, y, z);
//
//	//复合赋值 += -= *= /= %=
//	int a1 = 10;
//    a1 += 3;
//	//	a1 -= 3;
//	//  a1 *= 3;
//	//  a1 /= 3;
//	//  a1 %= 3;
//    printf("a1 = %d\n", a1);
//
////===============================================================
//
//	//单目操作符:++(前置/后置) --(前置/后置) +(正) -(负)
//
//	int a2 = 0;
//	a2++;
//    printf("a2 = %d\n", a2);
//	++a2;
//    printf("a2 = %d\n", a2);
//	//前置、后置都可以+1，没什么区别，对a2没影响
//
//	a2 = 0;
//	int b2 = a2++;//后置++，先使用(赋值)，后加1
//    printf("a2 = %d, b2 = %d\n", a2, b2);
//
//    a2 = 0;
//    b2 = ++a2;//前置++，先加1，后使用(赋值)
//    printf("a2 = %d, b2 = %d\n", a2, b2);
//
//	a2 = 0;
//	printf("a2-- = %d\n",a2--);
//    printf("--a2 = %d\n",a2);
//
//	// -- 同 ++
//	a2 = 0;
//	b2 = a2--;
//    printf("a2 = %d, b2 = %d\n", a2, b2);
//
//	//错误示例
//	int a3 = 0;
//	printf("a3 = %d\n", (++a3) + (++a3) + (++a3));//计算结果为随机数，不符合逻辑
//
//
//	//+(正) -(负) -->改变符号的作用，对绝对值无影响
//	int a4 = 10;
//	printf("a4 = %d\n", +a4);
//    printf("-a4 = %d\n", -a4);
//	// - 当连接两个操作数时为减号，只有一个操作数时为负号，计算机自动识别
//
////===============================================================
//
//	//强制类型转换 ( ) --> 也是一种操作符
//	int a5 = 3.6415;//浮点数赋给整型，被迫取整，小数部分丢掉，这么写会有警告
//	printf("a5 = %d\n", a5);
//
//	a5 = (int)3.1415;//强制类型转换，将3.1415转成整型，取整，小数部分丢掉，这么写不会有警告
//    printf("(int)a5 = %d\n", a5);
//
//
//
//	//关系操作符:== != > >= < <=
//	//逻辑操作符:&& || !
//	//成员访问操作符:. ->
//	//sizeof操作符:sizeof
//	//地址操作符:&
//	//取址操作符:*
//	//函数调用操作符:()
//
//
//	return 0;
//}



//移位操作符:<< >>
//
//对于整形来说：数据存放在内存中的其实是补码
// 正数：原码、反码、补码都一样。
// 负数：反码 = 原码（除符号位）按位取反；
//       补码 = 反码 + 1
// 
//int main()
//{ 
//	//1. << 左移
//	// 移位规则：左边抛弃，右边补0
//	int a = 10;
//	//0 00000000000000000000000001010
//	int b = a << 1;//20
//	//0 00000000000000000000000010100
//	//将a移位后的结果赋值给b，a的值不变
//    printf("a = %d\n", a);
//	printf("a << 1 = %d\n", b);
//
//	int a1 = -10;
//	//1 00000000000000000000000001010 - 原码
//	//1 11111111111111111111111110101 - 反码
//	//1 11111111111111111111111110110 - 补码
//	int b1 = a1 << 1;//-20
//	//1 11111111111111111111111101100 - 补码
//	//1 00000000000000000000000010100 - 原码
//    printf("a1 = %d\n", a1);
//    printf("a1 << 1 = %d\n", b1);
//
//
//	//2. >> 右移
//	// 移位规则：
//	// 逻辑右移：左边补0，右边抛弃
//	// 算术右移：左边用原符号位补，右边抛弃
//	//C语言标准中，没有明确规定，取决于编译器。用负数测试一下就可以
//    int a2 = -10;
//	//1 00000000000000000000000001010 - 原码
//	//1 11111111111111111111111110101 - 反码
//	//1 11111111111111111111111110110 - 补码
//    int b2 = a2 >> 1;// -5
//	//1 11111111111111111111111111011 - 补码（算术右移）
//	//1 00000000000000000000000000101 - 原码（算数右移）
//	printf("a2 = %d\n", a2);
//    printf("a2 >> 1 = %d\n", b2);
//
//	//对于移位操作符，不能移动负数位。
//	//int b3 = a3 >> -1; //error
//	//标准中未规定
//
//
//	return 0;
//}
//
// 
// 逻辑移位（unsigned 无符号数）：没有符号位，不需要担心
// 算术移位（signed 有符号数）：左移 << ：符号位移动，高位舍弃
//                              右移 >> ：符号位不移动，高位补符号位
//



//位操作符：& | ^ ~ 
// & 按位与，两个位都为1时为1，否则为0
// | 按位或，两个位有一个为1时为1，否则为0
// ^ 按位异或，两个位相同为0，相异为1
// ~ 按位取反，将1变为0，将0变为1
//int main()
//{
//    int a = 3;
//    //0 0000000000000000000000000000011 - 补码
//    int b = -6;
//    //1 1111111111111111111111111111010 - 补码
//    int r= a & b;
//    //0 0000000000000000000000000000010 - 补码
//    //因为是正数，原码补码相同
//    printf("a & b = %d\n", r);//2
//
//    int r1 = a | b;
//    //1 1111111111111111111111111111011 - 补码
//    //1 0000000000000000000000000000101 - 原码
//    printf("a | b = %d\n", r1);//-5
//
//    int r2 = a ^ b;
//    //1 1111111111111111111111111111001 - 补码
//    //1 0000000000000000000000000000111 - 原码
//    printf("a ^ b = %d\n", r2);//-7
//
//    int r3 = ~a;
//    //1 1111111111111111111111111111100 - 补码
//    //1 0000000000000000000000000000100 - 原码
//    printf("~a = %d\n", r3);
//
//
//    return 0;
//}



//逗号表达式
//逗号隔开的表达式，从左到右依次计算，并返回最后一个表达式的值
//int main()
//{
//    int a = 0;
//    int b = 0;
//    int c = 0;
//    a = (b = 10, c = 20, b + c);
//    printf("a = %d, b = %d, c = %d\n", a, b, c);
//    c = (a = b + 10, a, b = a + 1, a > b);
//    printf("a = %d, b = %d, c = %d\n", a, b, c);
//    return 0;
//}


//[] () 
//[] 下标引用操作符 arr[5]  -->  arr和5是操作数
//() 函数调用操作符 add(a, b) --> add、a、b都是操作数
//                  printf("hehe\n") --> printf和"hehe\n"都是操作数

// .  ->  结构成员访问操作符


//表达式求值
//1.整型提升
//2.算数转换

//int main()
//{
//    char a = 10;
//    char b = 120;
//    char c = a + b;
//    printf("c = %d\n", c);
//    return 0;
//}
